/**
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Sección 10
 * Carlos Alberto Solórzano Pineda (08832)
 * 06 de septiembre de 2011
 * @author carlos
 * @version 1.2
 * @param <E>
 *
 * Clase que emula una lista circular, hereda de AbstractList
 */
import java.util.AbstractList;

public class CircularList<E> extends AbstractList<E>{
	
	protected int count;
	protected Node<E> head;
	protected Node<E> tail;
	/**
	 * 
	 */
	public CircularList() {
		tail = null;
		count = 0;
	}
	
	/**value
	 * 
	 * @return El tamaño de la lista
	 */
	public int size() {
		return count;
	}
	
	/**
	 * 
	 * @param value
	 */
	public void addFirst(E value) {
		Node<E> temp = new Node<E>(value);
		if(tail == null){
			tail = temp;
			tail.setNext(tail);
		}else{
			temp.setNext(tail.next());
			tail.setNext(temp);
		}
		
		count++;
	}
	
	/**
	 * 
	 * @return El valor removido
	 */
	public E removeFirst(){
		Node<E> temp = tail.next();
		if (tail == tail.next()){
			tail = null;
		}else{
			tail.setNext(temp.next());
			temp.setNext(null);
		}
		
		return temp.value();
	}
	
	/**
	 * 
	 * @return El primer elemento de la lista
	 */
	public E peek(){
		return tail.next().value();
	}
	
	/**
	 * 
	 * @return El valor del primer elemento de la lista
	 */
	public E getFirst() {
		return head.value();
	}
	
	/**
	 * 
	 * @param value
	 */
	public void addLast(E value){
		addFirst(value);
		tail = tail.next();
	}
	
	/**
	 * 
	 * @return El último valor de la lista
	 */
	public E removeLast(){
		Node<E> finger = tail;
		
		while(finger.next() != tail){
			finger = finger.next();
		}
		
		Node<E> temp = tail;
		if(finger == tail){
			tail = null;
		}else{
			finger.setNext(tail.next());
			tail = finger;
		}
		
		count--;
		return temp.value();
	}

	@Override
	public E get(int arg0) {
		return null;
	}

	
}


